home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 1
/
Atari Mega Archive - Volume 1.iso
/
language
/
slperl.zoo
/
atarist
/
atarist.c
next >
Wrap
C/C++ Source or Header
|
1992-07-02
|
6KB
|
283 lines
/*
* random stuff for atariST
*/
#include "EXTERN.h"
#include "perl.h"
/* call back stuff, atari specific stuff below */
/* Be sure to refetch the stack pointer after calling these routines. */
int
callback(subname, sp, gimme, hasargs, numargs)
char *subname;
int sp; /* stack pointer after args are pushed */
int gimme; /* called in array or scalar context */
int hasargs; /* whether to create a @_ array for routine */
int numargs; /* how many args are pushed on the stack */
{
static ARG myarg[3]; /* fake syntax tree node */
int arglast[3];
arglast[2] = sp;
sp -= numargs;
arglast[1] = sp--;
arglast[0] = sp;
if (!myarg[0].arg_ptr.arg_str)
myarg[0].arg_ptr.arg_str = str_make("",0);
myarg[1].arg_type = A_WORD;
myarg[1].arg_ptr.arg_stab = stabent(subname, FALSE);
myarg[2].arg_type = hasargs ? A_EXPR : A_NULL;
return do_subr(myarg, gimme, arglast);
}
int
callv(subname, sp, gimme, argv)
char *subname;
register int sp; /* current stack pointer */
int gimme; /* called in array or scalar context */
register char **argv; /* null terminated arg list, NULL for no arglist */
{
register int items = 0;
int hasargs = (argv != 0);
astore(stack, ++sp, Nullstr); /* reserve spot for 1st return arg */
if (hasargs) {
while (*argv) {
astore(stack, ++sp, str_2mortal(str_make(*argv,0)));
items++;
argv++;
}
}
return callback(subname, sp, gimme, hasargs, items);
}
#include <process.h>
#include <stdio.h>
long _stksize = 64*1024L;
unsigned long __DEFAULT_BUFSIZ__ = 4 * 1024L;
/*
* The following code is based on the do_exec and do_aexec functions
* in file doio.c
*/
int
do_aspawn(really,arglast)
STR *really;
int *arglast;
{
register STR **st = stack->ary_array;
register int sp = arglast[1];
register int items = arglast[2] - sp;
register char **a;
char **argv;
char *tmps;
int status;
if (items) {
New(1101,argv, items+1, char*);
a = argv;
for (st += ++sp; items > 0; items--,st++) {
if (*st)
*a++ = str_get(*st);
else
*a++ = "";
}
*a = Nullch;
if (really && *(tmps = str_get(really)))
status = spawnvp(-P_WAIT,tmps,argv); /* -P_WAIT is a hack, see spawnvp.c in the lib */
else
status = spawnvp(-P_WAIT,argv[0],argv);
Safefree(argv);
}
return status;
}
int
do_spawn(cmd)
char *cmd;
{
return system(cmd);
}
#if 0 /* patchlevel 79 onwards we can */
/*
* we unfortunately cannot use the super efficient fread/write from the lib
*/
size_t fread(void *data, size_t size, size_t count, FILE *fp)
{
size_t i, j;
unsigned char *buf = (unsigned char *)data;
int c;
for(i = 0; i < count; i++)
{
for(j = 0; j < size; j++)
{
if((c = getc(fp)) == EOF)
return 0;
*buf++ = c;
}
}
return i;
}
size_t fwrite(const void *data, size_t size, size_t count, FILE *fp)
{
size_t i, j;
const unsigned char *buf = (const unsigned char *)data;
for(i = 0; i < count; i++)
{
for(j = 0; j < size; j++)
{
if(fputc(*buf++, fp) == EOF)
return 0;
}
}
return i;
}
#endif
#ifdef HAS_SYSCALL
#define __NO_INLINE__
#include <osbind.h> /* must include this for proper protos */
/* these must match osbind.pl */
#define TRAP_1_W 1
#define TRAP_1_WW 2
#define TRAP_1_WL 3
#define TRAP_1_WLW 4
#define TRAP_1_WWW 5
#define TRAP_1_WLL 6
#define TRAP_1_WWLL 7
#define TRAP_1_WLWW 8
#define TRAP_1_WWLLL 9
#define TRAP_13_W 10
#define TRAP_13_WW 11
#define TRAP_13_WL 12
#define TRAP_13_WWW 13
#define TRAP_13_WWL 14
#define TRAP_13_WWLWWW 15
#define TRAP_14_W 16
#define TRAP_14_WW 17
#define TRAP_14_WL 18
#define TRAP_14_WWW 19
#define TRAP_14_WWL 20
#define TRAP_14_WWLL 21
#define TRAP_14_WLLW 22
#define TRAP_14_WLLL 23
#define TRAP_14_WWWL 24
#define TRAP_14_WWWWL 25
#define TRAP_14_WLLWW 26
#define TRAP_14_WWWWWWW 27
#define TRAP_14_WLLWWWWW 28
#define TRAP_14_WLLWWWWLW 29
#define TRAP_14_WLLWWWWWLW 30
int syscall(trap, fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12 )
unsigned long trap, fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12;
{
/* for now */
switch(trap)
{
case TRAP_1_W:
return trap_1_w(fn);
case TRAP_1_WW:
return trap_1_ww(fn, a1);
case TRAP_1_WL:
return trap_1_wl(fn, a1);
case TRAP_1_WLW:
return trap_1_wlw(fn, a1, a2);
case TRAP_1_WWW:
return trap_1_www(fn, a1, a2);
case TRAP_1_WLL:
return trap_1_wll(fn, a1, a2);
case TRAP_1_WWLL:
return trap_1_wwll(fn, a1, a2, a3);
case TRAP_1_WLWW:
return trap_1_wlww(fn, a1, a2, a3);
case TRAP_1_WWLLL:
return trap_1_wwlll(fn, a1, a2, a3, a4);
case TRAP_13_W:
return trap_13_w(fn);
case TRAP_13_WW:
return trap_13_ww(fn, a1);
case TRAP_13_WL:
return trap_13_wl(fn, a1);
case TRAP_13_WWW:
return trap_13_www(fn, a1, a2);
case TRAP_13_WWL:
return trap_13_wwl(fn, a1, a2);
case TRAP_13_WWLWWW:
return trap_13_wwlwww(fn, a1, a2, a3, a4, a5);
case TRAP_14_W:
return trap_14_w(fn);
case TRAP_14_WW:
return trap_14_ww(fn, a1);
case TRAP_14_WL:
return trap_14_wl(fn, a1);
case TRAP_14_WWW:
return trap_14_www(fn, a1, a2);
case TRAP_14_WWL:
return trap_14_wwl(fn, a1, a2);
case TRAP_14_WWLL:
return trap_14_wwll(fn, a1, a2, a3);
case TRAP_14_WLLW:
return trap_14_wllw(fn, a1, a2, a3);
case TRAP_14_WLLL:
return trap_14_wlll(fn, a1, a2, a3);
case TRAP_14_WWWL:
return trap_14_wwwl(fn, a1, a2, a3);
case TRAP_14_WWWWL:
return trap_14_wwwwl(fn, a1, a2, a3, a4);
case TRAP_14_WLLWW:
return trap_14_wllww(fn, a1, a2, a3, a4);
case TRAP_14_WWWWWWW:
return trap_14_wwwwwww(fn, a1, a2, a3, a4, a5, a6);
case TRAP_14_WLLWWWWW:
return trap_14_wllwwwww(fn, a1, a2, a3, a4, a5, a6, a7);
case TRAP_14_WLLWWWWLW:
return trap_14_wllwwwwlw(fn, a1, a2, a3, a4, a5, a6, a7, a8);
case TRAP_14_WLLWWWWWLW:
return trap_14_wllwwwwwlw(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9);
}
}
#endif